package com.glsc.ngateway.common.api.flowable.dto.demand;

import com.glsc.ngateway.common.api.common.utils.DateUtil;
import com.glsc.ngateway.common.api.common.utils.JsonUtil;
import com.glsc.ngateway.common.api.flowable.dto.demand.node.ProcessNode;
import com.glsc.ngateway.common.api.flowable.resp.ResponseCommentDto;
import com.glsc.ngateway.common.api.flowable.resp.ResponseSituationDto;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.util.StringUtils;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;

/**
 * @author lixing
 * 国联自研需求
 */

@Data
@AllArgsConstructor
@NoArgsConstructor
public class TransactionEventManagementDto {

    /**
     * 需求唯一主键
     */
    String rqId;

    /**
     * 当前节点
     */
    ProcessNode currentNode;

    /**
     * 需求标题
     */
    String title;

    /**
     * 发起人
     */
    String starterAccount;

    /**
     * 发起人姓名
     */
    String starterName;

    /**
     * 发起时间
     */


    /***************************业务要素*************************************/

    /**
     * 需求提出部门
     */
    String rqDepartment;

    /**
     * 需求提出系统
     */
    String createProject;

    /**
     * 需求人,存放userId
     */
    String rqStaff;

    /**
     * 原始需求人
     */
    String oriRqStaff;

    /**
     * 原始需求人中文
     */
    String oriRqStaffName;

    /**
     * 需求类别
     */
    RqType rqType;

    /**
     * 需求紧急程度
     */
    RqUgtLevel rqUgtLevel;

    /**
     * 需求描述
     */
    String rqDesc;

    /**
     * 需求文档
     */
    List<Map<String, String>> rqFile;

    /**
     * 关联urls
     */
    List<String> rqUrls;

    /**
     * 技术解决方案
     */
    String solution;

    /**
     * 技术解决方案文档
     */
    List<Map<String, String>> solutionFiles;

    /**
     * 排期要素
     */
    List<ArrangeInf> arrangeinfo;

    /**
     * 上线要素
     */
    List<OnlineInf> onlineinfo;


    /**
     * 需求启动日期时间
     */
    LocalDateTime startDateTime;


    /**
     * 最后一次更新日期时间
     */
    LocalDateTime updateDateTime;


    /******************************其它要素*******************************/
    /**
     * 需求人中文名
     */
    String rqStaffCName;

    List<ResponseCommentDto> comments = new ArrayList<ResponseCommentDto>();

    String currentAssignee;
    String currentAssigneeName;

    /**
     * oa表单要素快照
     */
    List<Map<String, String>> oaPdfFile;

    String rqLevel;

    /**
     * 查询流程的反馈接口对象转成内部对象
     *
     * @param flowret
     * @return
     */
    public static TransactionEventManagementDto instance(ResponseSituationDto flowret) {
        TransactionEventManagementDto inst = new TransactionEventManagementDto();
        inst.rqId = flowret.getProcessId();
        //如果没有当前节点，表示已经结束
        //inst.currentNode = StringUtils.isEmpty(flowret.getCurrentTaskName()) ? ProcessNode.finish : ProcessNode.getProcessNode(flowret.getCurrentTaskName());
        if (StringUtils.isEmpty(flowret.getCurrentTaskName())) {
            inst.currentNode = ProcessNode.finish;
            if ("2".equals(flowret.getStatus())) {
                inst.currentNode = ProcessNode.cancel;
            }
        } else {
            inst.currentNode = ProcessNode.getProcessNode(flowret.getCurrentTaskName());
        }
        inst.title = flowret.getProcessTitle();
        inst.rqStaffCName = flowret.getStartUserChineseName();
        inst.startDateTime = DateUtil.getLocalDateTime(flowret.getStartTime());

        inst.currentAssignee = flowret.getCurrentAssignee();
        inst.currentAssigneeName = flowret.getCurrentAssigneeName();
        return inst;
    }

    /**
     * 查询流程的反馈接口对象转成内部对象
     *
     * @param flowret
     * @return
     */
    public static TransactionEventManagementDto instance(ResponseSituationDto flowret, FlowableDemandDto flowableDemand) {
        TransactionEventManagementDto inst = new TransactionEventManagementDto();

        inst.rqId = flowret.getProcessId();
        //如果没有当前节点，表示已经结束
        //inst.currentNode = StringUtils.isEmpty(flowret.getCurrentTaskName()) ? ProcessNode.finish : ProcessNode.getProcessNode(flowret.getCurrentTaskName());
        if (StringUtils.isEmpty(flowret.getCurrentTaskName())) {
            inst.currentNode = ProcessNode.finish;
            if ("2".equals(flowret.getStatus())) {
                inst.currentNode = ProcessNode.cancel;
            }
        } else {
            inst.currentNode = ProcessNode.getProcessNode(flowret.getCurrentTaskName());
        }
        inst.title = flowret.getProcessTitle();
        inst.rqStaffCName = flowret.getStartUserChineseName();

        //提交要素
        inst.rqDepartment = flowableDemand.getDepartment();
        inst.rqStaff = flowableDemand.getStaff();
        inst.createProject = flowableDemand.getSystemId();
        inst.oriRqStaff = flowableDemand.getOriginalStaff();
        inst.oriRqStaffName = flowableDemand.getOriginalStaffName();
        inst.rqType = RqType.getRqType(flowableDemand.getDemandType());
        inst.rqUgtLevel = RqUgtLevel.getRqUgtLevel(flowableDemand.getDemandEmergeLevel());
        if (!StringUtils.isEmpty(flowableDemand.getDemandDocument())) {
            inst.rqFile = (List<Map<String, String>>) JsonUtil.str2Obj(flowableDemand.getDemandDocument(), new ArrayList<Map<String, String>>().getClass());
        }
        inst.rqDesc = flowableDemand.getDemandDetail();
        inst.rqUrls = flowableDemand.getDemandUrl() == null ? null : (List) (Arrays.asList(flowableDemand.getDemandUrl().split(",")));

        inst.rqLevel = flowableDemand.getDemandLevel();
        //设计审核要素
        inst.solution = flowableDemand.getSolutionGeneral();
        if (!StringUtils.isEmpty(flowableDemand.getSolutionDocument())) {
            inst.solutionFiles = (List<Map<String, String>>) JsonUtil.str2Obj(flowableDemand.getSolutionDocument(), new ArrayList<Map<String, String>>().getClass());
        }

        //oa表单快照
        if (!StringUtils.isEmpty(flowableDemand.getOaPdfFile())) {
            inst.oaPdfFile = (List<Map<String, String>>) JsonUtil.str2Obj(flowableDemand.getOaPdfFile(), new ArrayList<Map<String, String>>().getClass());
        }

        //排期要素
        if (!StringUtils.isEmpty(flowableDemand.getArrangeinfo())) {
            inst.setArrangeinfo((List<ArrangeInf>) JsonUtil.str2Obj(flowableDemand.getArrangeinfo(), List.class));
        }


        //上线要素
        if (!StringUtils.isEmpty(flowableDemand.getOnlineinfo())) {
            inst.setOnlineinfo((List<OnlineInf>) JsonUtil.str2Obj(flowableDemand.getOnlineinfo(), List.class));
        }

        //时间要素
        inst.startDateTime = flowableDemand.getCreateTime();
        inst.updateDateTime = flowableDemand.getOpTime();

        return inst;
    }


}
